<?php
	/*==================================================================*/
	/*		文件名:Album.class.php                              */
	/*		概要: 分类管理类.                	       	    */
	/*		作者: 高洛峰                                        */
	/*		创建时间: 2009-05-25                                */
	/*		最后修改时间:2009-05-25                             */
	/*		copyright (c)2009 lampteacher@gmail.com             */
	/*==================================================================*/
	class CatModel extends  Model{	


		
		//==========================================
		// 函数: buildSelect($name, $default=null, $attrArray=array())
		// 功能: 构建在模板中显示的分类下拉框内容
		// 参数: name是select标签的名称，default被选择的默认是列表项，attrArray是select标签的其它属性
		// 返回: 生成的Select标签
		//==========================================
		function buildSelect($name, $default=1, $pros=array()) {
			$option = $this->getTree();	
			$htmlStr = '<select class="text-box" name="'.$name.'"';
			$str = ' ';
			if(!empty($pros) && is_array($pros)) {
				foreach($pros as $key => $value) {
					$str.="$key=\"$value\"";
				}
			}
			$htmlStr .= $str . '>';
			
			foreach($option as $value) {
				$title = str_repeat('&nbsp;&nbsp;&nbsp;&nbsp;',count(explode('-',$value['absPath']))-2) . '|-&nbsp;' . $value['title'];
				if ($value['id'] == $default) {	
					$htmlStr .= '<option value="'.$value['id'].'" selected>'.$title.'</option>';
				} else {
					$htmlStr .= '<option value="'.$value['id'].'">'.$title.'</option>';
				}
					
			}
			$htmlStr .= '</select>';
			
			return $htmlStr; 
		}


	
		//==========================================
		// 函数:  getAbsPath($catPid)
		// 功能: 获取无限分类的绝对路径
		// 参数: 类别的父ID
		// 返回: 返回指定分类分类的路径
		//==========================================
		function getAbsPath($pid){
			$sql="SELECT path FROM {$this->tabName} WHERE id='".$pid."'";
			$result=$this->mysqli->query($sql);
			$data=$result->fetch_assoc();
			return $data["path"];
		}	
		//==========================================
		// 函数:  getCatPath($catPid)
		// 功能:获取分类的结构树的查看路径
		// 参数: catpid分类的父类ID
		// 返回: 返回查看路径的字符串
		//==========================================
		function getCatPath($pid) {
			$absPath=$this->getAbsPath($pid);
			return $absPath.'-'.$pid;
		}
		//==========================================
		// 函数: catAdd($post)
		// 功能: 向数据表中添加分类记录
		// 参数: post提供在表单中输入的分类信息数组
		// 返回: true或false
		//==========================================
		function catAdd($post) {
			$post["path"]=$this->getCatPath($post['pid']);
			if($this->add($post) ){
				$this->messList[] = "添加<b> ".$post["title"]."</b> 成功.";
				return true;
			}else{
				$this->messList[] = "添加<b> ".$post["title"]."</b> 失败.";
				return false;
			}
		}

		function getPid($path){
			$pos = strrpos($path, "-");
			if ($pos === false) { 
				return 0;
			}else{
				return substr($path,$pos+1);
			}
			
		}


		//==========================================
		// 函数: catMod()
		// 功能: 修改单个分类信息
		// 参数: post是表单提交的数组信息，catId是需要修改分类的ID
		// 返回: true或false
		//==========================================
		function catMod($post) {
			if(!$this->isSelfNode($post)){
				$this->messList[] = "不能将{$post['title']}移动到自己的子类别中.";
				return false;
			}
			if(!$this->moveTo($post)){   //修改所在的类，子类也一起修改
				$this->messList[] = "类别移动失败.";
				return false;	
			}
			if($this->mod($post) ){
				$this->messList[] = "修改<b> ".$post["title"]."</b> 成功.";
				return true;
			}else{
				$this->messList[] = "修改<b> ".$post["title"]."</b> 失败.";
				return false;
			}
		}

		//==========================================
		// 函数:  moveTo($catId,$catPath)
		// 功能: 移动分类到某个节点下
		// 参数: 
		// 返回: 
		//==========================================
		private function moveTo($post){
			$ppath=$this->getCatPath($post["pid"]);  //新选择的父节点的path
			$cpath=$ppath.'-'.$post["id"];	          //和现有的操作的分类Id相连
			$xpath=$this->getCatPath($post["id"]);     //操作节点的path

			$zsql="update {$this->tabName} set path=REPLACE(path, '{$xpath}','{$cpath}') where path like '{$xpath}%';";	
			$sql="update {$this->tabName} set path='{$ppath}' where id='".$post["id"]."'";
			

			if($this->mysqli->query($zsql)){
				if($this->mysqli->query($sql)){
					$this->messList[] = "分类类别{$post['title']}的子类别移动成功.";
				}
				$this->messList[] = "分类类别{$post['title']}移动成功.";
				return true;
			}else{
				return false;
			} 
		}

		function isSelfNode($post){
		
			$ppath=$this->getAbsPath($post["pid"]);  //新选择的父节点的path
			$xpath=$this->getCatPath($post["id"]);     //操作节点的path

			if(preg_match("/{$xpath}/", $ppath)){
				return false;
			}else{
				return true;
			}
		}

		//==========================================
		// 函数: remove($id)
		// 功能: 删除分类及子分类和分类下面的图片
		// 参数: id是需要删除分类的类别ID
		// 返回: true或false
		//==========================================
		function remove($id){
			$catPath=$this->getCatPath($id);    
			$sql = "DELETE FROM {$this->tabName} WHERE id= '{$id}' OR path LIKE '".$catPath."%'";
	
			$result=$this->mysqli->query($sql);
			if($result && $this->mysqli->affected_rows >0 ){   
				$this->messList[] = "删除成功.";
				return true;
			}else{
				$this->messList[] = "删除失败.";
				return false;
			}
		}
	}

